home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / misc / amoricv0.lha / AmoricV0_8a / src / CPU6502_020.asm next >
Assembly Source File  |  1995-10-06  |  16KB  |  1,108 lines

  1. ; D0   : **scratch**
  2. ; d1.b : A
  3. ; d2.b : X
  4. ; d3.b : Y
  5. ; d4.b : P
  6. ; d5.b : S
  7. ; D6   : **scratch**
  8. ; D7   : **scratch**
  9.  
  10. ; a0.l : Mem Ptr
  11. ; a1.l : Mem Ptr + $304
  12. ; a2.l : Functable pour les instructions
  13. ; a3.l : Pointeur sur diverses tables
  14. ; a4.l : PC+Base Adr
  15. ; a5.l : Retour apres traitement d'instruction
  16. ; a6.l : **Scratch**
  17.  
  18.     MACHINE    68020
  19.  
  20.         XDEF    _FunctTable
  21.     XDEF    _MiscTable
  22.  
  23.         XDEF    _InitFonctions
  24.         XDEF    _BRK
  25.         XDEF    _IRQ
  26.         XDEF    _LDA
  27.         XDEF    _RTS
  28.         
  29.     XDEF    _TapeMemPtr
  30.     XDEF    _TapeMemSize
  31.     XDEF    _TapeMemOffset
  32.  
  33.     XREF    _BreakReason
  34.     XREF    _ReturnToMonitor
  35.     XREF    @Place
  36.  
  37.     XREF    _PlaySample
  38.  
  39.     XREF    _son_keybeep
  40.     XREF    _son_contbeep
  41.     XREF    _son_zap
  42.     XREF    _son_ping
  43.  
  44.     include    "my_defs.i"
  45.     include    "my_macros.asm"
  46.     include "CPUmacros.asm"
  47.  
  48. SETFUNCT: MACRO
  49.     move.l    #\2,D0
  50.     lsl.l    #2,D0
  51.     move.l    #\1,(A1,D0.L)
  52.     ENDM
  53.  
  54. ; *** Elaboration de certaines fonctions ***
  55. ; *** (Merci les macros !!!) ***
  56.  
  57.  
  58.     MODESADD    LDA
  59.     MODESADD    LDX
  60.     MODESADD    LDY
  61.     
  62.     MODESADD    STA
  63.     MODESADD    STX
  64.     MODESADD    STY
  65.  
  66.     MODESADD    CMP
  67.     MODESADD    CPX
  68.     MODESADD    CPY
  69.  
  70.     MODESADD    AND
  71.     MODESADD    EOR
  72.     MODESADD    ORA
  73.  
  74.     MODESADD    ADC
  75.     MODESADD    SBC
  76.  
  77.     MODESADD    INC
  78.     MODESADD    DEC
  79.  
  80.     MODESADD    LSR
  81.     MODESADD    ASL
  82.     MODESADD    ROL
  83.     MODESADD    ROR    
  84.     MODESADD    BIT
  85.  
  86. ; *** Decalages ***
  87.  
  88. LogicalShiftRight:MACRO
  89.     lsr.b    #1,\1
  90.     TEST_NZC
  91.     ENDM
  92.  
  93. ArithmeticShiftLeft:MACRO
  94.     asl.b    #1,\1
  95.     TEST_NZC
  96.     ENDM
  97.  
  98. RotateRight:MACRO
  99.     SET_C2X
  100.     roxr.b    #1,\1
  101.     TEST_NZC
  102.     ENDM
  103.  
  104. RotateLeft:MACRO
  105.     SET_C2X
  106.     roxl.b    #1,\1
  107.     TEST_NZC
  108.     ENDM    
  109.             
  110. ; *** Mettre une banque de fonctions a en valeur
  111.  
  112. SetFunctionBank:
  113.     STORE_REGS
  114.     move.w    #$F,D2
  115.     
  116. SFBLoop:
  117.     move.l    D0,D1
  118.     lsl.l    #2,D1
  119.     move.l    A2,(A1,D1.L)
  120.  
  121.     add.l    #$10,D0
  122.     dbf    D2,SFBLoop
  123.  
  124.     RESTORE_REGS
  125.     rts
  126.  
  127. ; *** Initialiser les fonctions ***
  128.  
  129. _InitFonctions:
  130.     lea    _FunctTable,A1
  131.     lea    IllegalInstruction(PC),A2
  132.     move.l    #$FF,D0
  133. IFLoop:
  134.     move.l    A2,(A1)+
  135.     dbf    D0,IFLoop
  136.  
  137.     lea    _FunctTable,A1
  138.  
  139.     moveq.l    #2,D0
  140.     lea    IllegalInstruction(PC),A2
  141.     bsr    SetFunctionBank
  142.  
  143.     moveq.l    #3,D0
  144.     lea    NOP2(PC),A2
  145.     bsr    SetFunctionBank
  146.     moveq.l    #4,D0
  147.     bsr    SetFunctionBank
  148.     moveq.l    #7,D0
  149.     bsr    SetFunctionBank
  150.  
  151.     moveq.l    #$A,D0
  152.     lea    NOP(PC),A2
  153.     bsr    SetFunctionBank
  154.     moveq.l    #$B,D0
  155.     bsr    SetFunctionBank
  156.  
  157.     moveq.l    #$C,D0
  158.     lea    NOP3(PC),A2
  159.     bsr    SetFunctionBank
  160.     move.b    #$F,D0
  161.     bsr    SetFunctionBank
  162.  
  163.  
  164.     SETFUNCT _BRK,$00
  165.     SETFUNCT JSR,$20
  166.     SETFUNCT JMP_IMM,$4C
  167.     SETFUNCT JMP_IND,$6C
  168.     SETFUNCT RTS,$60
  169.     SETFUNCT RTI,$40
  170.     SETFUNCT ADC_ZRP,$65
  171.     SETFUNCT ADC_IMM,$69
  172.     SETFUNCT ADC_ZRPX,$75
  173.     SETFUNCT ADC_INDX,$61
  174.     SETFUNCT ADC_INDY,$71
  175.     SETFUNCT ADC_ABS,$6D
  176.     SETFUNCT ADC_ABSX,$7D
  177.     SETFUNCT ADC_ABSY,$79
  178.     SETFUNCT SBC_ZRP,$E5
  179.     SETFUNCT SBC_IMM,$E9
  180.     SETFUNCT SBC_ZRPX,$F5
  181.     SETFUNCT SBC_INDX,$E1
  182.     SETFUNCT SBC_INDY,$F1
  183.     SETFUNCT SBC_ABS,$ED
  184.     SETFUNCT SBC_ABSX,$FD
  185.     SETFUNCT SBC_ABSY,$F9
  186.     SETFUNCT BIT_ZRP,$24
  187.     SETFUNCT BIT_ABS,$2C
  188.     SETFUNCT STA_INDX,$81
  189.     SETFUNCT STA_ABS,$8D
  190.     SETFUNCT STA_ABSX,$9D
  191.     SETFUNCT STA_ABSY,$99
  192.     SETFUNCT STA_INDY,$91
  193.     SETFUNCT STA_ZRP,$85
  194.     SETFUNCT STA_ZRPX,$95
  195.     SETFUNCT STX_ZRP,$86
  196.     SETFUNCT STX_ZRPY,$96
  197.     SETFUNCT STX_ABS,$8E
  198.     SETFUNCT STY_ZRP,$84
  199.     SETFUNCT STY_ZRPX,$94
  200.     SETFUNCT STY_ABS,$8C
  201.     SETFUNCT LDY_IMM,$A0
  202.     SETFUNCT LDY_ZRP,$A4
  203.     SETFUNCT LDY_ZRPX,$B4
  204.     SETFUNCT LDY_ABS,$AC
  205.     SETFUNCT LDY_ABSX,$BC
  206.     SETFUNCT LDX_IMM,$A2
  207.     SETFUNCT LDX_ZRP,$A6
  208.     SETFUNCT LDX_ZRPY,$B6
  209.     SETFUNCT LDX_ABS,$AE
  210.     SETFUNCT LDX_ABSY,$BE
  211.     SETFUNCT LDA_IMM,$A9
  212.     SETFUNCT LDA_ZRP,$A5
  213.     SETFUNCT LDA_ZRPX,$B5
  214.     SETFUNCT LDA_INDX,$A1
  215.     SETFUNCT LDA_INDY,$B1
  216.     SETFUNCT LDA_ABS,$AD
  217.     SETFUNCT LDA_ABSX,$BD
  218.     SETFUNCT LDA_ABSY,$B9
  219.     SETFUNCT AND_IMM,$29
  220.     SETFUNCT AND_ZRP,$25
  221.     SETFUNCT AND_ZRPX,$35
  222.     SETFUNCT AND_INDX,$21
  223.     SETFUNCT AND_INDY,$31
  224.     SETFUNCT AND_ABS,$2D
  225.     SETFUNCT AND_ABSX,$3D
  226.     SETFUNCT AND_ABSY,$39
  227.     SETFUNCT EOR_IMM,$49
  228.     SETFUNCT EOR_ZRP,$45
  229.     SETFUNCT EOR_ZRPX,$55
  230.     SETFUNCT EOR_INDX,$41
  231.     SETFUNCT EOR_INDY,$51
  232.     SETFUNCT EOR_ABS,$4D
  233.     SETFUNCT EOR_ABSX,$5D
  234.     SETFUNCT EOR_ABSY,$59
  235.     SETFUNCT ORA_IMM,$09
  236.     SETFUNCT ORA_ZRP,$05
  237.     SETFUNCT ORA_ZRPX,$15
  238.     SETFUNCT ORA_INDX,$01
  239.     SETFUNCT ORA_INDY,$11
  240.     SETFUNCT ORA_ABS,$0D
  241.     SETFUNCT ORA_ABSX,$1D
  242.     SETFUNCT ORA_ABSY,$19
  243.     SETFUNCT CMP_ZRP,$C5
  244.     SETFUNCT CMP_IMM,$C9
  245.     SETFUNCT CMP_INDY,$D1
  246.     SETFUNCT CMP_INDX,$C1
  247.     SETFUNCT CMP_ZRPX,$D5
  248.     SETFUNCT CMP_ABS,$CD
  249.     SETFUNCT CMP_ABSX,$DD
  250.     SETFUNCT CMP_ABSY,$D9
  251.     SETFUNCT CPX_IMM,$E0
  252.     SETFUNCT CPX_ZRP,$E4
  253.     SETFUNCT CPX_ABS,$EC
  254.     SETFUNCT CPY_IMM,$C0
  255.     SETFUNCT CPY_ZRP,$C4
  256.     SETFUNCT CPY_ABS,$CC
  257.     SETFUNCT BCC,$90
  258.     SETFUNCT BCS,$B0
  259.     SETFUNCT BEQ,$F0
  260.     SETFUNCT BNE,$D0
  261.     SETFUNCT BMI,$30
  262.     SETFUNCT BPL,$10
  263.     SETFUNCT BVC,$50
  264.     SETFUNCT BVS,$70
  265.     SETFUNCT CLD,$D8
  266.     SETFUNCT SED,$F8
  267.     SETFUNCT CLC,$18
  268.     SETFUNCT SEC,$38
  269.     SETFUNCT CLI,$58
  270.     SETFUNCT SEI,$78
  271.     SETFUNCT CLV,$B8
  272.     SETFUNCT NOP,$EA
  273.     SETFUNCT TXA,$8A
  274.     SETFUNCT TXS,$9A
  275.     SETFUNCT TYA,$98
  276.     SETFUNCT TSX,$BA
  277.     SETFUNCT TAY,$A8
  278.     SETFUNCT TAX,$AA
  279.     SETFUNCT INX,$E8
  280.     SETFUNCT INY,$C8
  281.     SETFUNCT DEX,$CA
  282.     SETFUNCT DEY,$88
  283.     SETFUNCT PHA,$48
  284.     SETFUNCT PHP,$08
  285.     SETFUNCT PLA,$68
  286.     SETFUNCT PLP,$28
  287.     SETFUNCT ROL_IMP,$2A
  288.     SETFUNCT ROL_ZRP,$26
  289.     SETFUNCT ROL_ZRPX,$36
  290.     SETFUNCT ROL_ABS,$2E
  291.     SETFUNCT ROL_ABSX,$3E
  292.     SETFUNCT ROR_IMP,$6A
  293.     SETFUNCT ROR_ZRP,$66
  294.     SETFUNCT ROR_ZRPX,$76
  295.     SETFUNCT ROR_ABS,$6E
  296.     SETFUNCT ROR_ABSX,$7E
  297.     SETFUNCT ASL_IMP,$0A
  298.     SETFUNCT ASL_ZRP,$06
  299.     SETFUNCT ASL_ZRPX,$16
  300.     SETFUNCT ASL_ABS,$0E
  301.     SETFUNCT ASL_ABSX,$1E
  302.     SETFUNCT LSR_IMP,$4A
  303.     SETFUNCT LSR_ZRP,$46
  304.     SETFUNCT LSR_ZRPX,$56
  305.     SETFUNCT LSR_ABS,$4E
  306.     SETFUNCT LSR_ABSX,$5E
  307.     SETFUNCT DEC_ZRP,$C6
  308.     SETFUNCT DEC_ZRPX,$D6
  309.     SETFUNCT DEC_ABS,$CE
  310.     SETFUNCT DEC_ABSX,$DE
  311.     SETFUNCT INC_ZRP,$E6
  312.     SETFUNCT INC_ZRPX,$F6
  313.     SETFUNCT INC_ABS,$EE
  314.     SETFUNCT INC_ABSX,$FE
  315.     SETFUNCT TrapOPCode,$07
  316.     SETFUNCT TrapOPCode,BREAK_CODE
  317.     SETFUNCT TrapOPCode,PRINT_CODE
  318.     SETFUNCT TrapOPCode,TAPE_CODE
  319.     SETFUNCT TrapOPCode,SOUND_CODE
  320.     SETFUNCT TrapOPCode,FRESET_CODE
  321.  
  322. ; *** Quelques instructions non documentees
  323. ; Remplacees par des NOP avec PC+=1 2 ou 3
  324.  
  325.     SETFUNCT NOP,$80
  326.     SETFUNCT NOP,$89
  327.  
  328.     SETFUNCT NOP3,$0C
  329.     SETFUNCT NOP3,$9E
  330.  
  331.     move.l    #STACK_BEGIN,D5 ; initialiser le mot haut de la pile.
  332.             
  333.     rts
  334.  
  335. _FunctTable:
  336.     blk.l 256
  337.  
  338. ; *** Instructions illegales ***
  339.  
  340. IllegalInstruction
  341.     BAD_INST    ILLEGAL_INSTRUCTION
  342.     
  343.  
  344. ; *** Instructions Trappees ***
  345. ; *** Breakpoints ou instructions foireuses
  346.  
  347. TrapOPCode:
  348.     move.b    -1(A4),D6    ; Instruction courante
  349.  
  350.     cmp.b    #TAPE_CODE,D6
  351.     beq    IOOperation
  352.  
  353.     cmp.b    #SOUND_CODE,D6
  354.     beq    IOOperation
  355.  
  356. NotaSound:
  357.     cmp.b    #BREAK_CODE,D6
  358.     bne.b    NotaBreakpoint
  359.     BAD_INST    BREAKPOINT
  360. NotaBreakpoint:
  361.     cmp.b    #FRESET_CODE,D6
  362.     bne.b    NotFastReset
  363.     
  364.     move.l    A4,D0
  365.     sub.l    A0,D0
  366.     cmp.w    #$FA3D,D0
  367.     bne.b    NotFastReset
  368.  
  369.     ; Fast Reset, remplace la routine originale
  370.  
  371.     STORE_REGS
  372.     move.w    #$2EFC,D6    ; (C000-400-1)/4
  373.     add.w    #$400,A0
  374.     move.l    #$55555555,D7
  375. FRLoop:
  376.     move.l    D7,(A0)+
  377.     dbf    D6,FRLoop
  378.  
  379.     RESTORE_REGS
  380.  
  381.     move.w    #$00C0,$C(A0)    ; $C000 a l'envers
  382.  
  383.     add.l    #$20,A4    ; PC = FA5D
  384.     GOOD_INST
  385.  
  386. NotFastReset:
  387.     BAD_INST    ILLEGAL_INSTRUCTION    
  388.  
  389.  
  390.  
  391. ; ******* LDA *********
  392. ; ******* A=D1.B ******
  393. ; ******* Param:D6.L ******
  394.  
  395. LDA:
  396. _LDA:
  397.     LDz    D1
  398.     
  399. LDA_IMM:
  400.     LDz_IMM    D1
  401.  
  402. ; ******* LDX *********
  403. ; ******* X=D2.B ******
  404. ; ******* Param:D6.L ******
  405.  
  406. LDX:
  407.     LDz    D2
  408.  
  409. LDX_IMM:
  410.     LDz_IMM    D2
  411.     
  412. ; ******* LDY *********
  413. ; ******* Y=D3.B ******
  414. ; ******* Param:D6.L ******
  415.  
  416. LDY:
  417.     LDz    D3
  418.  
  419. LDY_IMM:
  420.     LDz_IMM    D3
  421.  
  422. ; ******* STA *********
  423. ; ******* Adresse:D6 ******
  424.  
  425. STA:
  426.     STz    D1
  427.  
  428. ; ******* STX *********
  429. ; ******* Adresse:D6 ******
  430.  
  431. STX:
  432.     STz    D2
  433.  
  434. ; ******* STY *********
  435. ; ******* Adresse:D6 ******
  436.  
  437. STY:
  438.     STz    D3
  439.         
  440. ; ******* CMP *********
  441. ; ******* A=D1.B ******
  442. ; ******* Param:D6.L ******
  443.  
  444. CMP:
  445.     CPz    D1
  446. CMP_IMM:
  447.     CPz_IMM    D1
  448.     
  449. ; ******* CPX *********
  450. ; ******* X=D2.B ******
  451. ; ******* Param:D6.L ******
  452.  
  453. CPX:
  454.     CPz    D2
  455. CPX_IMM:
  456.     CPz_IMM    D2
  457.     
  458. ; ******* CPY *********
  459. ; ******* Y=D3.B ******
  460. ; ******* Param:D6.L ******
  461.  
  462. CPY:
  463.     CPz    D3
  464.  
  465. CPY_IMM:
  466.     CPz_IMM    D3
  467.     
  468. ; ******* ADC *********
  469. ; ******* A=D1.B ******
  470. ; ******* Param:D6.L ******
  471.  
  472. ADC:
  473.     move.b    (A0,D6.L),D7
  474.     ADC_MACRO
  475. ADC_IMM:
  476.     move.b    (A4)+,D7
  477.     ADC_MACRO
  478.     
  479. ; ******* SBC *********
  480. ; ******* A=D1.B ******
  481. ; ******* Param:D6.b ******
  482.  
  483. SBC:
  484.     move.b    (A0,D6.L),D7
  485.     SBC_MACRO
  486.  
  487. SBC_IMM:
  488.     move.b    (A4)+,D7
  489.     SBC_MACRO
  490.  
  491.  
  492. ; ******* EOR Immediat *********
  493. ; ******* A=D1.B ******
  494. ; ******* Param:D6.b ******
  495.  
  496. EOR_IMM:
  497.     MOVE.B    (A4)+,D6
  498.     EOR.B    D6,D1
  499.     TEST_NZ
  500.     GOOD_INST
  501.  
  502. ; ******* EOR *********
  503. ; ******* A=D1.B ******
  504. ; ******* Param:D6.b ******
  505.  
  506. EOR:
  507.     MOVE.B    (A0,D6.L),D6
  508.     EOR.B    D6,D1
  509.     TEST_NZ
  510.     GOOD_INST
  511.     
  512. ; ******* ORA Immediat *********
  513. ; ******* A=D1.B ******
  514. ; ******* Param:D6.b ******
  515.  
  516. ORA_IMM:
  517.     MOVE.B    (A4)+,D6
  518.     OR.B    D6,D1
  519.     TEST_NZ
  520.     GOOD_INST
  521.  
  522. ; ******* ORA *********
  523. ; ******* A=D1.B ******
  524. ; ******* Param:D6.b ******
  525.  
  526. ORA:
  527.     MOVE.B    (A0,D6.L),D6
  528.     OR.B    D6,D1
  529.     TEST_NZ
  530.     GOOD_INST
  531.     
  532. ; ******* AND Immediat*********
  533. ; ******* A=D1.B ******
  534. ; ******* Param:D6.b ******
  535.  
  536. AND_IMM:
  537.     MOVE.B    (A4)+,D6
  538.     AND.B    D6,D1
  539.     TEST_NZ
  540.     GOOD_INST
  541.     
  542. ; ******* AND *********
  543. ; ******* A=D1.B ******
  544. ; ******* Param:D6.b ******
  545.  
  546. AND:
  547.     MOVE.B    (A0,D6.L),D6
  548.     AND.B    D6,D1
  549.     TEST_NZ
  550.     GOOD_INST
  551.     
  552.  
  553. ; ******* INC *********
  554. ; ******* A=D1.B ******
  555. ; ******* Param:D6 ******
  556.  
  557. INC:
  558.     move.b    (A0,D6.L),D7
  559.     addq.b    #1,D7
  560.     TEST_NZ
  561.     jsr    @Place
  562.     GOOD_INST
  563.  
  564. ; ******* DEC *********
  565. ; ******* A=D1.B ******
  566. ; ******* Param:D6 ******
  567.  
  568. DEC:
  569.     move.b    (A0,D6.L),D7
  570.     subq.b    #1,D7
  571.     TEST_NZ
  572.     jsr    @Place
  573.     GOOD_INST
  574.  
  575. ; ******* BIT Immediat *********
  576. ; ******* A=D1.B ******
  577. ; ******* Param:D6 ******
  578.  
  579. BIT_IMM:
  580.     move.b    (A4)+,D6
  581.     BIT_MACRO
  582.     GOOD_INST
  583.  
  584. ; ******* BIT *********
  585. ; ******* A=D1.B ******
  586. ; ******* Param:D6 ******
  587.  
  588. BIT:
  589.     move.b    (A0,D6.L),D6
  590.     BIT_MACRO
  591.     GOOD_INST
  592.  
  593. ; ******* LSR *********
  594. ; ******* Param:D6 ******
  595.  
  596. LSR:
  597.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  598.     LogicalShiftRight    D7
  599.     jsr    @Place
  600.     GOOD_INST
  601.  
  602. ; ******* ASL *********
  603. ; ******* Param:D6 ******
  604.  
  605. ASL:
  606.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  607.     ArithmeticShiftLeft    D7
  608.     jsr    @Place
  609.     GOOD_INST
  610.     
  611. ; ******* ROR *********
  612. ; ******* Param:D6 ******
  613.  
  614. ROR:
  615.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  616.     RotateRight    D7
  617.     jsr    @Place
  618.     GOOD_INST
  619.     
  620. ; ******* ROL *********
  621. ; ******* Param:D6 ******
  622.  
  623. ROL:
  624.     move.b    (A0,D6.L),D7  ; M[D6] -> D7
  625.     RotateLeft    D7
  626.     jsr    @Place
  627.     GOOD_INST
  628.  
  629. ; ******* LSR IMPLICITE *********
  630. ; ******* Param:D6 ******
  631.  
  632. LSR_IMP:
  633.     LogicalShiftRight    D1
  634.     GOOD_INST
  635.         
  636. ; ******* ASL *********
  637. ; ******* Param:D6 ******
  638.  
  639. ASL_IMP:
  640.     ArithmeticShiftLeft    D1
  641.     GOOD_INST
  642.     
  643. ; ******* ROR *********
  644. ; ******* Param:D6 ******
  645.  
  646. ROR_IMP:
  647.     RotateRight    D1
  648.     GOOD_INST
  649.     
  650. ; ******* ROL *********
  651. ; ******* Param:D6 ******
  652.  
  653. ROL_IMP:
  654.     RotateLeft    D1
  655.     GOOD_INST
  656.     
  657.  
  658. ; *** BRK ***
  659.  
  660. _BRK:
  661.     addq.l    #2,A4    ; Saute une instruction en retour
  662.     SAVE_ADR
  663.     GET_WORD    $FFFE
  664.     move.l    D0,A4
  665.     add.l    A0,A4
  666.  
  667.     EMPILER D4
  668.     bset    #B_BIT,D4        ; ** bit B mis **
  669.  
  670.     GOOD_INST
  671.  
  672. _IRQ:
  673.     addq.l    #1,A4
  674.     SAVE_ADR
  675.     GET_WORD    $FFFE
  676.     move.l    D6,A4
  677.     add.l    A0,A4
  678.  
  679.     EMPILER D4
  680.  
  681.     GOOD_INST
  682.  
  683.  
  684. ; *** JSR ***
  685.  
  686. JSR:
  687.     addq.l    #2,A4
  688.     SAVE_ADR
  689.     subq.l    #2,A4
  690.     ABSOLU
  691.     move.l    D6,A4
  692.     add.l    A0,A4
  693.     GOOD_INST
  694.     
  695.  
  696. ; *** JMP Immediat ***
  697.  
  698. JMP_IMM:
  699.     ABSOLU
  700.     move.l    D6,A4
  701.     add.l    A0,A4
  702.     GOOD_INST
  703.  
  704. ; *** JMP Indirect ***
  705.  
  706. JMP_IND:
  707.     INDIRECT
  708.     move.l    D6,A4
  709.     add.l    A0,A4
  710.     GOOD_INST
  711.  
  712. ; *** RTS ***
  713.  
  714. RTS:
  715. _RTS:
  716.     RESTORE_ADR
  717.     addq.l    #1,A4
  718.     GOOD_INST
  719.  
  720. ; *** RTI ***
  721.  
  722. RTI:
  723.     DEPILER    D4                    
  724.     RESTORE_ADR
  725.     GOOD_INST
  726.  
  727. ; *** BCC ***
  728.  
  729. BCC:
  730.     DONT_BRANCH    C_BIT
  731.  
  732. ; *** BCS ***
  733.  
  734. BCS:
  735.     BRANCH        C_BIT
  736.  
  737. ; *** BEQ ***
  738.  
  739. BEQ:
  740.     BRANCH        Z_BIT
  741.     
  742. ; *** BNE ***
  743.  
  744. BNE:
  745.     DONT_BRANCH    Z_BIT
  746.  
  747. ; *** BMI ***
  748.  
  749. BMI:
  750.     BRANCH        N_BIT
  751.  
  752. ; *** BPL ***
  753.  
  754. BPL:
  755.     DONT_BRANCH    N_BIT
  756.     
  757. ; *** BVC ***
  758.  
  759. BVC:
  760.     DONT_BRANCH    V_BIT
  761.     
  762. ; *** BVS ***
  763.  
  764. BVS:
  765.     BRANCH        V_BIT
  766.     
  767. ; *** CLC ***
  768.  
  769. CLC:
  770.     CLEAR_BIT_P    C_BIT
  771.     
  772. ; *** CLD ***
  773.  
  774. CLD:
  775.     CLEAR_BIT_P    D_BIT
  776.  
  777. ; *** CLI ***
  778.  
  779. CLI:
  780.     CLEAR_BIT_P    I_BIT
  781.  
  782. ; *** CLV ***
  783.  
  784. CLV:
  785.     CLEAR_BIT_P    V_BIT
  786.  
  787. ; *** SEC ***
  788.  
  789. SEC:
  790.     SET_BIT_P    C_BIT
  791.     
  792. ; *** SED ***
  793.  
  794. SED:
  795.     SET_BIT_P    D_BIT
  796.  
  797. ; *** SEI ***
  798.  
  799. SEI:
  800.     SET_BIT_P    I_BIT
  801.  
  802. ; *** NOP ***
  803.  
  804. NOP:
  805.     GOOD_INST
  806.  
  807. NOP2:
  808.     addq.l    #1,A4
  809.     GOOD_INST
  810.  
  811. NOP3:
  812.     addq.l    #2,A4
  813.     GOOD_INST
  814.  
  815. ; *** TXA ***
  816.  
  817. TXA:
  818.     Txy    D2,D1
  819.  
  820. ; *** TAX ***
  821.  
  822. TAX:
  823.     Txy    D1,D2
  824.  
  825. ; *** TAY ***
  826.  
  827. TAY:
  828.     Txy    D1,D3
  829.     
  830. ; *** TYA ***
  831.  
  832. TYA:
  833.     Txy    D3,D1
  834.  
  835. ; *** TXS ***
  836. ; ** On n'utilise pas Txy car
  837. ; ** Il n'y a pas de test de condition
  838.  
  839. TXS:
  840.     move.b    D2,D5
  841.     GOOD_INST    
  842.  
  843. ; *** TSX ***
  844.  
  845. TSX:
  846.     Txy    D5,D2
  847.  
  848. ; *** INX ***
  849.  
  850. INX
  851.     addq.b    #1,D2
  852.     TEST_NZ
  853.     GOOD_INST
  854.     
  855. ; *** INY ***
  856.  
  857. INY
  858.     addq.b    #1,D3
  859.     TEST_NZ
  860.     GOOD_INST
  861.     
  862. ; *** DEX ***
  863.  
  864. DEX
  865.     subq.b    #1,D2
  866.     TEST_NZ
  867.     GOOD_INST
  868.     
  869. ; *** DEY ***
  870.  
  871. DEY
  872.     subq.b    #1,D3
  873.     TEST_NZ
  874.     GOOD_INST
  875.     
  876. ; *** PHA ***
  877.  
  878. PHA:
  879.     EMPILER    D1
  880.     GOOD_INST
  881.     
  882. ; *** PLA ***
  883.  
  884. PLA:
  885.     DEPILER D1
  886.     TEST_NZ
  887.     GOOD_INST
  888.  
  889. ; *** PHP ***
  890.  
  891. PHP:
  892.     EMPILER    D4
  893.     GOOD_INST
  894.     
  895. ; *** PLP ***
  896.  
  897. PLP:
  898.     DEPILER D4
  899.     GOOD_INST
  900.  
  901.  
  902. ; *** No other OP Code. Too bad. There would have been so many bugs to remove.
  903.  
  904. ; Tape Operation : D0 : PC de l'appel
  905.  
  906. NoTapeIn:
  907.     GOOD_INST
  908.  
  909. IOOperation:
  910.     subq.l    #1,A4
  911.     tst.l    _TapeMemPtr
  912.     beq.b    NoTapeIn
  913.  
  914.     ; *** Selon PC, on va voir quelle routine
  915.     ; *** Est sollicitee
  916.  
  917.     move.l    A4,D7
  918.     sub.l    A0,D7    ; D7 = PC
  919.     lea    IO_OricRoutineTable(PC),A6
  920.     moveq.l    #0,D0
  921.     subq.l    #1,D0
  922. TOLoop:
  923.     addq.l    #1,D0
  924.     move.w    (A6,D0.L*2),D6
  925.     beq.b    TOFock    
  926.     cmp.l    D6,D7
  927.     bne.b    TOLoop
  928.  
  929.     lea    IO_AmigaRoutineTable(PC),A6
  930.     move.l    (A6,D0.L*4),A6
  931.     jmp    (A6)
  932.  
  933. PatchOutbyt:
  934.     bra    RTS
  935.  
  936. PatchRdbyte:
  937.     bsr.b    LireOctet
  938.     tst.b    D7
  939.     bne.b    NoTapeIn
  940.     move.b    D0,D1    ; LDA D7
  941.     TEST_NZ
  942.     CLR_PB    C_BIT
  943.     bra    RTS
  944.  
  945. PatchSync:
  946.     bsr.b    LireOctet
  947.     tst.b    D7
  948.     bne.b    NoTapeIn
  949.     cmp.b    #$16,D0
  950.     bne.b    PatchSync
  951. EndPatchSync:
  952.     moveq.l    #0,D2    ; X=0
  953.     CLR_PB    C_BIT
  954.     bra    RTS
  955.  
  956. PatchOutchr:
  957.     bra    RTS
  958.  
  959. ; *** Lire un octet
  960. ; In : Rien
  961. ; Out : D7 = 0 si ok -1 sinon
  962. ;       D0 = Valeur octet
  963.  
  964. LireOctet:
  965.     move.l    _TapeMemSize(PC),D7
  966.     addq.l    #1,D7
  967.     cmp.l    _TapeMemOffset(PC),D7
  968.     beq.b    LO_EOT
  969.     move.l    _TapeMemPtr(PC),A6
  970.     add.l    _TapeMemOffset(PC),A6    ; A6->Octet a lire
  971.     move.b    (A6),D0
  972.     add.l    #1,_TapeMemOffset
  973.     moveq.l    #0,D7
  974.     rts
  975. LO_EOT:
  976.     moveq.l    #-1,D7    ; Fin de bande
  977.     rts
  978.  
  979. TOFock:
  980.     BAD_INST    ILLEGAL_INSTRUCTION    
  981.  
  982. PlayZap:
  983.     bra    RTS    ; Pour l'instant, on va se calmer
  984.     lea    _son_zap,A6
  985.     jsr    _PlaySample
  986.     bra    RTS
  987.  
  988. PlayPing:
  989.     bra    RTS    ; Pour l'instant, on va se calmer
  990.     lea    _son_ping,A6
  991.     jsr    _PlaySample
  992.     bra    RTS
  993.  
  994. PlayContBeep:
  995.     bra    RTS    ; Pour l'instant, on va se calmer
  996.     lea    _son_contbeep,A6
  997.     jsr    _PlaySample
  998.     bra    RTS
  999.  
  1000. PlayKeyBeep:
  1001.     bra    RTS    ; Pour l'instant, on va se calmer
  1002.     lea    _son_keybeep,A6
  1003.     jsr    _PlaySample
  1004.     bra    RTS    ; Pour l'instant, on va se calmer
  1005.  
  1006. PlayShoot:
  1007.     bra    RTS
  1008.  
  1009. PlayExplode:
  1010.     bra    RTS
  1011.  
  1012. PlayPlay:
  1013. PlaySound:
  1014. PlayMusic:
  1015.     bra    RTS    ; Pour l'instant, on va se calmer
  1016.  
  1017. IO_OricRoutineTable:
  1018.     dc.w    J_OUTBYT,J_RDBYTE,J_SYNC,J_OUTCHR
  1019.     dc.w    J_ZAP,J_PING,J_CONTBP,J_KBBEEP
  1020.     dc.w    J_SHOOT,J_EXPLODE
  1021.     dc.w    J_PLAY,J_SOUND,J_MUSIC,0
  1022.  
  1023. IO_AmigaRoutineTable:
  1024.     dc.l    PatchOutbyt,PatchRdbyte,PatchSync,PatchOutchr
  1025.     dc.l    PlayZap,PlayPing,PlayContBeep,PlayKeyBeep
  1026.     dc.l    PlayShoot,PlayExplode
  1027.     dc.l    PlayPlay,PlaySound,PlayMusic
  1028.  
  1029. _TapeMemOffset:
  1030.     dc.l    0
  1031. _TapeMemPtr:
  1032.     dc.l    0
  1033. _TapeMemSize:
  1034.     dc.l    0
  1035.  
  1036.  
  1037. _MiscTable:
  1038. TabP:
  1039. TabNZ:
  1040.     dc.b    $0    ; Position 0 pour 68K    0000
  1041.     dc.b    $0    ; C=1 mais on s'en fout    0001
  1042.     dc.b    $0    ; V=1 ""     ""    0010
  1043.     dc.b    $0    ; C=1 V=1        0011
  1044.     dc.b    $2    ; Z=1            0100
  1045.     dc.b    $2    ; Z=1 C=1        0101
  1046.     dc.b    $2    ; Z=1 V=1        0110
  1047.     dc.b    $2    ; Z=1 V=1 C=1        0111
  1048.     dc.b    $80    ; N=1            1000
  1049.     dc.b    $80    ; N=1 C=1        1001
  1050.     dc.b    $80    ; N=1 V=1        1010
  1051.     dc.b    $80    ; N=1 V=1 C=1        1011
  1052.     dc.b    $82    ; N=1 Z=1        1100
  1053.     dc.b    $82    ; N=1 Z=1 C=1        1101
  1054.     dc.b    $82    ; N=1 Z=1 V=1        1110
  1055.     dc.b    $82    ; N=1 Z=1 V=1 C=1    1111
  1056. TabNZC:
  1057.     dc.b    $0    ; Position 0 pour 68K    0000
  1058.     dc.b    $1    ; C=1            0001
  1059.     dc.b    $0    ; V=1            0010
  1060.     dc.b    $1    ; C=1 V=1        0011
  1061.     dc.b    $2    ; Z=1            0100
  1062.     dc.b    $3    ; Z=1 C=1        0101
  1063.     dc.b    $2    ; Z=1 V=1        0110
  1064.     dc.b    $3    ; Z=1 V=1 C=1        0111
  1065.     dc.b    $80    ; N=1            1000
  1066.     dc.b    $81    ; N=1 C=1        1001
  1067.     dc.b    $80    ; N=1 V=1        1010
  1068.     dc.b    $81    ; N=1 V=1 C=1        1011
  1069.     dc.b    $82    ; N=1 Z=1        1100
  1070.     dc.b    $83    ; N=1 Z=1 C=1        1101
  1071.     dc.b    $82    ; N=1 Z=1 V=1        1110
  1072.     dc.b    $83    ; N=1 Z=1 V=1 C=1    1111
  1073. TabNZCV:
  1074.     dc.b    $0    ; Position 0 pour 68K    0000
  1075.     dc.b    $1    ; C=1            0001
  1076.     dc.b    $40    ; V=1            0010
  1077.     dc.b    $41    ; C=1 V=1        0011
  1078.     dc.b    $2    ; Z=1            0100
  1079.     dc.b    $3    ; Z=1 C=1        0101
  1080.     dc.b    $42    ; Z=1 V=1        0110
  1081.     dc.b    $43    ; Z=1 V=1 C=1        0111
  1082.     dc.b    $80    ; N=1            1000
  1083.     dc.b    $81    ; N=1 C=1        1001
  1084.     dc.b    $C0    ; N=1 V=1        1010
  1085.     dc.b    $C1    ; N=1 V=1 C=1        1011
  1086.     dc.b    $82    ; N=1 Z=1        1100
  1087.     dc.b    $83    ; N=1 Z=1 C=1        1101
  1088.     dc.b    $C2    ; N=1 Z=1 V=1        1110
  1089.     dc.b    $C3    ; N=1 Z=1 V=1 C=1    1111
  1090.  
  1091. TabNZC_CMP:
  1092.     dc.b    $80    ; Position 0 pour 68K    0000
  1093.     dc.b    $81    ; C=1            0001
  1094.     dc.b    $80    ; V=1 On s'en fout    0010
  1095.     dc.b    $81    ; C=1 V=1        0011
  1096.     dc.b    $3    ; Z=1            0100
  1097.     dc.b    $3    ; Z=1 C=1        0101
  1098.     dc.b    $3    ; Z=1 V=1        0110
  1099.     dc.b    $3    ; Z=1 V=1 C=1        0111
  1100.     dc.b    $0    ; N=1            1000
  1101.     dc.b    $1    ; N=1 C=1        1001
  1102.     dc.b    $0    ; N=1 V=1        1010
  1103.     dc.b    $1    ; N=1 V=1 C=1        1011
  1104.     dc.b    $3    ; N=1 Z=1        1100
  1105.     dc.b    $3    ; N=1 Z=1 C=1        1101
  1106.     dc.b    $3    ; N=1 Z=1 V=1        1110
  1107.     dc.b    $3    ; N=1 Z=1 V=1 C=1    1111
  1108.